lexer grammar XMLexer;

options {
  language = Java;
}

@header {
    package es.etsii.pl.P6_Flexer;
}

@members {
    boolean tagMode = false;
}

// Referencia: http://www.antlr.org/wiki/display/ANTLR3/1.+Lexer

OPENTAG : '<' { tagMode = true; } ;
ENDTAG : '</' { tagMode = true; } ;
CLOSETAG : '>' { tagMode = false; } ;
TEXT : { !tagMode }? => (~'<') ;

ID : { tagMode }? => ( LETTER | '_') (NAMECHAR)* ;
ATTR_EQ : { tagMode }? => '=' ;
ATTR_VALUE : { tagMode }? =>
        ( '"' (~'"')* '"'
        | '\'' (~'\'')* '\''
        )
    ;

fragment LETTER 
    : ('a'..'z' | 'A'..'Z') 
    ;
fragment DIGIT 
    : ('0'..'9') 
    ;
fragment NAMECHAR
    : LETTER | DIGIT | '.' | '-' | '_' | ':'
    ;
    
WS  : {tagMode}? => (' ' | '\r' | '\t' | '\u000C' | '\n') { $channel=HIDDEN; } ;
    
COMMENT
    :   '<!--' (options {greedy=false;} : . )* '-->' { $channel=HIDDEN; }
    ;